From: Wei Liu Date: Thu, 4 Sep 2014 22:43:11 +0000 (+0100) Subject: libxl: store a copy of configuration when creating domain X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4441 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=af1f8aa9899f5ff8a1783a49fe6f0c566b8b7bc7;p=xen.git libxl: store a copy of configuration when creating domain The configuration is stored in libxl-json format. It will be used as template to reconstruct domain configuration during runtime. There's only one write to disk when domain creation finishes. We therefore have a window that the domain exists but has no JSON config in disk. We define this state as domain being created or destroyed. Any other operations that need to access JSON config should bail. Signed-off-by: Wei Liu Acked-by: Ian Campbell --- diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index ee328e9d0d..57a0ece4f2 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -1389,10 +1389,30 @@ static void domcreate_complete(libxl__egc *egc, { STATE_AO_GC(dcs->ao); libxl_domain_config *const d_config = dcs->guest_config; + libxl_domain_config *d_config_saved = &dcs->guest_config_saved; if (!rc && d_config->b_info.exec_ssidref) rc = xc_flask_relabel_domain(CTX->xch, dcs->guest_domid, d_config->b_info.exec_ssidref); + if (!rc) { + libxl__carefd *lock; + + /* Note that we hold CTX lock at this point so only need to + * take data store lock + */ + lock = libxl__lock_domain_userdata(gc, dcs->guest_domid); + if (!lock) { + rc = ERROR_LOCK_FAIL; + } else { + libxl__update_domain_configuration(gc, d_config_saved, d_config); + rc = libxl__set_domain_configuration(gc, dcs->guest_domid, + d_config_saved); + libxl__unlock_domain_userdata(lock); + } + } + + libxl_domain_config_dispose(d_config_saved); + if (rc) { if (dcs->guest_domid) { dcs->dds.ao = ao; @@ -1443,6 +1463,8 @@ static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config, GCNEW(cdcs); cdcs->dcs.ao = ao; cdcs->dcs.guest_config = d_config; + libxl_domain_config_init(&cdcs->dcs.guest_config_saved); + libxl_domain_config_copy(ctx, &cdcs->dcs.guest_config_saved, d_config); cdcs->dcs.restore_fd = restore_fd; cdcs->dcs.callback = domain_create_cb; cdcs->dcs.checkpointed_stream = checkpointed_stream; diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index 8ac1c1447a..e9747f1e52 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -506,6 +506,27 @@ out: return rc; } +void libxl__update_domain_configuration(libxl__gc *gc, + libxl_domain_config *dst, + const libxl_domain_config *src) +{ + int i; + + /* update network interface information */ + for (i = 0; i < src->num_nics; i++) + libxl__update_config_nic(gc, &dst->nics[i], &src->nics[i]); + + /* update vtpm information */ + for (i = 0; i < src->num_vtpms; i++) + libxl__update_config_vtpm(gc, &dst->vtpms[i], &src->vtpms[i]); + + /* update guest UUID */ + libxl_uuid_copy(CTX, &dst->c_info.uuid, &src->c_info.uuid); + + /* video ram */ + dst->b_info.video_memkb = src->b_info.video_memkb; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 22c564f6e9..3b8f74edf6 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2781,6 +2781,7 @@ struct libxl__domain_create_state { /* filled in by user */ libxl__ao *ao; libxl_domain_config *guest_config; + libxl_domain_config guest_config_saved; /* vanilla config */ int restore_fd; libxl__domain_create_cb *callback; libxl_asyncprogress_how aop_console_how; @@ -3249,6 +3250,26 @@ int libxl__get_domain_configuration(libxl__gc *gc, uint32_t domid, int libxl__set_domain_configuration(libxl__gc *gc, uint32_t domid, libxl_domain_config *d_config); +/* ------ Things related to updating domain configurations ----- */ +void libxl__update_domain_configuration(libxl__gc *gc, + libxl_domain_config *dst, + const libxl_domain_config *src); +static inline void libxl__update_config_nic(libxl__gc *gc, + libxl_device_nic *dst, + libxl_device_nic *src) +{ + dst->devid = src->devid; + libxl_mac_copy(CTX, &dst->mac, &src->mac); +} + +static inline void libxl__update_config_vtpm(libxl__gc *gc, + libxl_device_vtpm *dst, + libxl_device_vtpm *src) +{ + dst->devid = src->devid; + libxl_uuid_copy(CTX, &dst->uuid, &src->uuid); +} + #endif /*